文件上传

为了能上传文件,必须将表单的method设为POST, 并将enctype设置为multipart/form-data,只有在这种情况下,浏览器才会把用户选择的文件二进制数据发送给服务器。

SpringMVC为文件上传提供了直接的支持,这种支持是用即插即用的MultipartResolver实现的。

SpringMVC会将上传文件绑定到MultipartFile对象中。这个对象提供了上传文件内容,文件名等方法,通过transferTo()方法可以将文件存储在硬件中。

常用方法

1
2
3
4
5
6
byte[] getBytes()   //获取文件数据
String getContentType() //获取文件MIME类型
String getName() //获取表单中文件组件的名字
String getOriginalFilename()// 获取上传文件的原名。
long getSize() //获取文件的字节大小
void transferTo(File dest) /* 将上传文件保存到一个目标文件中* /

SpringMVC 上下文默认没有装配MultipartResolver,因此默认情况下不能处理文件上传工作,若要使用,则需要配置。

1
2
3
4
5
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 指定所上传文件的总大小不能超过20M。注意maxUploadSize属性的限制不是针对单个文件,而是所有文件的容量之和 -->
<property name="maxUploadSize" value="20000000"/>
<property name="defaultEncoding" value="utf-8"></property>
</bean>

拦截器

Interceptor拦截器的主要作用是拦截用户的请求并进行相应的处理,比如通过拦截器进行用户权限认证,判断用户是否登录等。

SpringMVC中的拦截器是拔插式设计,需要某个拦截器,只需在配置文件中应用该拦截器即可。

1
2
3
4
5
6
7
8
9
<mvc:interceptors>
<mvc:interceptor>
<!--拦截有请求-->
<mvc:mapping path="/**/">
<!--排除-->
<mvc:exclde-mapping path="/login/">
<bean class ="org.sysu.interceptor.SessionInterceptor" ></bean>
<mvc:interceptor>
</mvc:interceptors>

HandlerInterceptor接口

SpringMVC中的拦截器请求通过实现HandlerInterceptor接口来完成,要定义一个拦截器,可以实现HandlerInterceptor接口,或者继承抽象类HandlerInterceptorAdapter。

HandlerInterceptor中定义了三个方法

1
boolean preHandle(HttpServletRequest request,HttpServletResponse response,Object handle)

请求处理前被调用,SpringMVC中的Interceptor 是链式调用,一个应用或者一个请求中可以同时存在多个Interceptor,每个Interceptor 根据声明顺序依次执行,preHandler的返回方法是布尔型的,返回false时,表示请求结束,后续的Interceptor和Controller都不会执行,返回值为true时,就会调用下一个Interceptor的prehandle方法,如果已经是最后一个Interceptor,就会调用当前请求的Controller方法。

1
void postHandle(HttpServletRequest request,HttpServletResponse response,Object handle,ModelAndView mv)

该方法和之后的afterCompletion都是只能在当前所属的Interceptor的preHandler方法的返回值为true时才会被调用。postHandler在Controller方法调用之后执行,但是会在DispatcherServlet 进行视图返回渲染之前被调用。所以可以对处理后的ModelAndView对象进行操作。先声明的Interceptor的postHandler反而后执行。

1
void afterCompletion(HttpServletRequest request,HttpServletResponse response,Object handle,Exception exception)

在渲染视图之后执行,方法的主要作用是进行资源清理。